﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ModelUML
{
    [Serializable]
    public class ElementUML
    {
        public virtual List<String> Validate()
        {
            List<String> lista = new List<string>();
            if (nazwa.Length > 0)
            {
                if (char.IsLetter(nazwa[0]))
                {
                    lista.Add("\"" + nazwa + "\" nie jest poprawną nazwą");
                }
            }
            return lista;
        }
        internal List<iDiagram> diagramy = new List<iDiagram>();
        public void DodajElementDoDiagramu(iDiagram diag)
        {
            diagramy.Add(diag);
        }
        public void UsunElementZDiagramu(iDiagram diag)
        {
            diagramy.Remove(diag);
        }
        String nazwa;
        internal String NazwaForce
        {
            set
            {
                nazwa = value;
            }
        }
        public String Nazwa
        {
            get 
            {
                return nazwa;
            }
            set
            {                
                if (this.JestKlasa)
                {
                    KontenerUML k = ((KlasaUML)this).kontener;
                    if (k!=null) 
                    foreach (ElementUML el in k.Elementy)
                    {
                        if (el.JestKlasa && el != this)
                        {
                            if (el.Nazwa.Equals(value))
                            {
                                throw new NameException((KlasaUML)this, (KlasaUML)el);                                 
                            }
                        }
                    }
                }
                nazwa = value;                
            }
        }
        List<NotatkaUML> notatki = new List<NotatkaUML>();
        public NotatkaUML DodajNotatke(String zawartosc)
        {
            NotatkaUML notatka = new NotatkaUML(zawartosc);
            notatki.Add(notatka);
            if (notatka.WlascicielNotaki != null)
            {
                notatka.WlascicielNotaki.UsunNotatke(notatka);
            }
            notatka.WlascicielNotaki = this;
            return notatka;
        }
        public NotatkaUML DodajNotatke(NotatkaUML notatka)
        {
            notatki.Add(notatka);
            return notatka;
        }
        public int IloscNotatek
        {
            get
            {
                return notatki.Count;
            }
        }
        public NotatkaUML GetNotatka(int index)
        {
            return notatki[index];
        }
        public void UsunNotatke(int index)
        {
            notatki.RemoveAt(index);
        }
        public void UsunNotatke(NotatkaUML notatka)
        {
            notatki.Remove(notatka);
        }
        VisibilityKindUML visibility;
        public VisibilityKindUML Visibility
        {
            get
            {
                return visibility;
            }
            set
            {
                visibility = value;
            }
        }
        public bool JestTypemDanych
        {
            get
            {
                return (this is TypDanychUML);
            }
        }
        public bool JestNotatka
        {
            get
            {
                return (this is NotatkaUML);
            }
        }
        public bool JestKlasa
        {
            get
            {
                return (this is KlasaUML);
            }
        }
        public bool JestAsocjacja
        {
            get
            {
                return (this is AsocjacjaUML);
            }
        }
        public bool JestOperacja
        {
            get
            {
                return (this is OperacjaUML);
            }
        }
        public bool JestAtrybutem
        {
            get
            {
                return (this is AtrybutUML);
            }
        }
        public bool JestAktorem
        {
            get
            {
                return (this is AktorUML);
            }
        }
        public bool JestPrzypadkiemUzycia
        {
            get
            {
                return (this is AkcjaUML);
            }
        }
        public bool JestInterfejsem
        {
            get
            {
                return (this is InterfejsUML);
            }
        }
    }
}
